package com.isak.likou.likoudemo;

import com.isak.likou.likoudemo.utils.RandomString;

import java.util.HashMap;
import java.util.Map;

/**
 * 题目：随机给定一串全小写的字符串，求最长回文的长度以及最长回文内容
 * <p>
 * 回文解释：字符串反着读和正着读是一样的，如：“aba”  "cccc"
 */
public class HuiWenStringTest {

    public static Map<String, String> map = new HashMap<>(); // 用户保存回文字符串

    public static void main(String[] args) {
        String s = RandomString.getLowerString();
        System.out.println(s);
        map.put("s", String.valueOf(s.charAt(0))); // 防止没有回文，先放置首个字符
        System.out.println(getString(s, 2));
        System.out.println(map.get("s"));
    }

    /**
     * 字符串最长回文
     *
     * @param a
     * @param b
     * @return
     */
    public static int getString(String a, int b) {
        if (a == null || "".equals(a)) {
            return 0;
        }
        if (a.length() == 1) {
            map.put("s", a);
            return 1;
        }
        for (int i = 0; i <= a.length() - b; i++) {
            String substring = a.substring(i, i + b);
            if (judgeString(substring)) {
                map.put("s", substring);
                if (b == a.length()) {
                    return b;
                }
                return getString(a, b + 1);
            }
            if (b % 2 == 0 && b < a.length()) {
                int k = getString(a, b + 1);
                if (b != k) {
                    return k;
                }
            }
        }
        return b - 1;
    }

    /**
     * 判断字符串是否为回文
     * 以下字符串反转方法用了StringBuffer类的reverse方法,每次都需要new对象出来;可使用StringUtils工具类的reverse方法进行优化
     *
     * @param d
     * @return
     */
    public static boolean judgeString(String d) {
        if (d.length() % 2 == 0) { // 当字符串长度为偶数时,如“abba”,则需要截取'ab'和'ba'的反转后结果进行比较
            if ((d.substring(0, (d.length() / 2)))
                    .equals(new StringBuffer(d.substring((d.length() / 2))).reverse().toString())) {
                return true;
            }
        } else { // 当字符串长度为奇数时, 如“abkba”,则需要截取'ab'和'ba'的反转后结果进行比较,中间'k'则可以忽略
            if ((d.substring(0, (d.length() / 2)))
                    .equals(new StringBuffer(d.substring((d.length() / 2) + 1)).reverse().toString())) {
                return true;
            }
        }
        return false;
    }

}
